package com.ipan.builder.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.Settings;
import org.hibernate.tool.ipan.reveng.IDatabaseReverser;

import com.ipan.builder.entity.JpaEntityCfg;

/**
 * 数据库操作接口
 * 
 * @author iPan
 * @version 2013-11-27
 */
public interface DatabaseOp {

	// -- 生成表-- //
	/**
	 * 更新所有实体到数据库（同时会更新注释）
	 */
	public void updateAllTables();

	/**
	 * 更新实体到数据库（同时会更新注释）
	 */
	public void updateTable(List<JpaEntityCfg> jpaEntityCfgList);
	
	/**
	 * 更新实体到数据库（同时会更新注释）
	 */
	public void updateTable(JpaEntityCfg jpaEntityCfg);
	
	// -- 生成实体 -- //
	/**
	 * 反转数据库所有表到实体
	 */
	public void createAllEntities();
	
	/**
	 * 反转数据库指定的表到实体
	 */
	public void createEntity(String[] tables);
	
	/**
	 * 反转数据库被过滤的表到实体（支持通配符.*）
	 */
	public void createEntityByFilter(String[] matchTables);
	
	// -- 更新注释-- //
	/**
	 * 更新实体注释到数据库
	 */
	public void updateAllComment();
	
	/**
	 * 更新实体注释到数据库
	 */
	public void updateComment(JpaEntityCfg entityCfg);
	
	/**
	 * 更新实体注释到数据库
	 */
	public void updateComment(List<JpaEntityCfg> entityCfgList);
	
	
	// -- 基本信息获取 -- //
	/**
	 * 获取JDBCMetaDataConfiguration
	 */
	public JDBCMetaDataConfiguration getConfiguration();
	
	/**
	 * 创建JDBCMetaDataConfiguration
	 */
	public JDBCMetaDataConfiguration createConfiguration();
	
	/**
	 * 获取Settings
	 */
	public Settings getSettings();
	
	/**
	 * 获取配置的SchemaName
	 */
	public String getSchemaName();
	
	/**
	 * 获取配置的CatalogName
	 */
	public String getCatalogName();
	
	/**
	 * 获取反转引擎
	 */
	public IDatabaseReverser getReverser();
	
	
	// -- 数据库操作 -- //
	/**
	 * 获取Connection
	 */
	public Connection getConnection();

	/**
	 * 执行SQL
	 */
	public void execute(String sql, Object[] param);
	
	/**
	 * 关闭Connection
	 */
	public void closeConnection(Connection conn);
	
	/**
	 * 关闭Statement
	 */
	public void closeStatement(Statement statement);
	
	/**
	 * 关闭ResultSet
	 */
	public void closeResultSet(ResultSet resultSet);
	
	/**
	 * 抛出异常JDBCException
	 */
	public void throwJDBCException(Exception e);
	
	/**
	 * 抛出异常JDBCException
	 */
	public void throwJDBCException(SQLException e, String sql, Object[] params);
	
	/**
	 * 填充PreparedStatement参数
	 */
	public void fillStatement(PreparedStatement stmt, Object[] params);
	
}
